package com.cslc.wechat.common.dao;

import java.io.Serializable;
import java.util.List;

public interface HibernateDao {
	
	/**
	 * 根据id删除某个持久化对象的实例
	 *
	 * @param entityClass
	 *            Class
	 * @param id
	 *            Serializable
	 */
	@SuppressWarnings("unchecked")
	void delete(final Class entityClass, final Serializable id);

	/**
	 * 由于很多情况下只有一个参数，故封装未知个参数的查询方法，使用起来更灵活简单
	 * @param hql 查询语句
	 * @param param 查询参数
	 * @return 符合条件的结果集列表
	 */
	@SuppressWarnings("unchecked")
	List findByParam(String hql, Object... param);


	/**
	 * 通过指定类型、hql、查询参数查询唯一实体对象
	 * @param <T>	返回结果类型
	 * @param clazz	Class
	 * @param hql	查询语句
	 * @param param 参数数组
	 * @return	结果对象
	 */
	<T> T findUniqueObjByParam(Class<T> clazz, String hql, Object... param);

	/**
	 * 如果hql是多个对象属性的拼接即不需要明确指定数据类型时使用此方法
	 * @param hql	查询语句
	 * @param param	参数数组
	 * @return 结果对象
	 */
	Object findUniqueObjByParam(String hql, Object... param);

	/**
	 * 根据hql及指定params参数获取集合
	 * @param hql	查询语句
	 * @param params	参数数组
	 * @return	结果集合
	 */
	@SuppressWarnings("unchecked")
	List findByParams(String hql, Object[] params);
	
	/**
	 * 根据id获得某个持久化对象的实例，如果不存在，则返回null
	 *
	 * @param entityClass
	 *            Class
	 * @param id
	 *            Serializable
	 * @return Object
	 */
	@SuppressWarnings("unchecked")
	Object find(final Class entityClass, final Serializable id);

	/**
	 * 将给定的持久化对象实例插入到数据库中
	 *
	 * @param entity
	 *            Object
	 * @return Serializable
	 */
	Serializable insert(final Object entity);


	/**
	 * 获得符合hql查询条件的持久化对象的全部实例
	 *
	 * @param queryString
	 *            String
	 * @return List
	 */
	List query(final String queryString);


	/**
	 * 通过原始sql和指定参数查询:适用于业务逻辑比较复杂或sql依赖于底层数据库的情况
	 * @param sqlStr sql语句
	 * @param params 参数
	 * @return 结果集合
	 */
	List queryBySqlWithParams(String sqlStr, Object...params);


	/**
	 * 将给定的持久化对象实例插入或更新到数据库中
	 *
	 * @param entity
	 *            Object
	 */
	void saveOrUpdate(final Object entity);

	/**
	 * 将给定的持久化对象实例更新到数据库中
	 *
	 * @param entity
	 *            Object
	 */
	void update(final Object entity);

	/**
	 * 通过sql语句查询，获得结果列表
	 *
	 * @param sqlString
	 *            String
	 * @return List 结果集
	 */
	List queryBySql(final String sqlString);

	/**
	 * 指params参数 更新hql操作
	 * @param hql hql查询语句
	 * @param params 参数数组
	 * @return 影响条数
	 */
	int updateByHql(final String hql,Object[] params);

	/**
	 * 指params参数 更新sql操作
	 * @param sql	查询语句
	 * @param params	参数数组
	 * @return	影响条数
	 */
	int updateBySql(final String sql,Object[] params);
}
